#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int Six[10]={1,6,36,216,1296,7776,46656,279936};
int dp[500005];
//每个套餐最多有5种物品，每种物品最多买5个
struct node{
    //比如00032(6进制)表示第0种物品买2个，第1种买3个
    //六进制表示
    int has;
    //状态作为容量
    int n;
    //价格作为价值
    int v;
}s[205];
//记录某个编号的物品在六进制的第几位
int Hash[1005];
int main(void){
    //freopen("data.txt","r",stdin);
    //物品种类数
    int b;
    while(~scanf("%d",&b)){
        memset(Hash,-1,sizeof(Hash));
        //不用套餐直接买的价格
        int ans=0;
        //物品标号
        int tmp;
        //总的状态，要购买的物品和数量（作为背包容量）
        int Num=0;
        for(int i=0;i<b;i++){
            scanf("%d%d%d",&tmp,&s[i].n,&s[i].v);
            ans+=s[i].n*s[i].v;
            //六进制的每一位表示每一种物品
            Num+=s[i].n*Six[i];
            Hash[tmp]=Six[i];
            s[i].has=s[i].n=Six[i];
        }
        //优惠套餐数
        int m;
        scanf("%d",&m);
        //套餐中的物品种类数
        int k;
        for(int i=0;i<m;i++){
            scanf("%d",&k);
            int x,y;
            while(k--){
                //优惠套餐中物品的种类和数量
                scanf("%d%d",&x,&y);
                if(Hash[x]==-1){
                    //前面没出现过这种物品，即这种物品无需购买
                    continue;
                }
                s[i+b].n+=Hash[x]*y;
            }
            scanf("%d",&s[i+b].v);
        }
        // printf("%d\n",Num);
        // int t=Num;
        // while(t){
        //     printf("%d",t%6);
        //     t/=6;
        // }
        // printf("\n");
        // for(int i=0;i<b+m;i++){
        //     printf("%d %d ",s[i].has,s[i].n);
        //     //1 1 2
        //     //6 6 5
        //     //0 3 5
        //     //这里13化为六进制就是21 也就表示0种类的1个 1种类的2个
        //     //0 13 10
        //     t=s[i].n;
        //     while(t){
        //         printf("%d",t%6);
        //         t/=6;
        //     }
        //     printf(" %d\n",s[i].v);
        // }
        //所以就是将每一个优惠套餐的状态用一个六进制数来保存，转换成完全背包问题
        memset(dp,INF,sizeof(dp));
        dp[0]=0;
        for(int i=0;i<b+m;i++){
            //j是状态，dp[j]表示达到j状态的最小价格
            for(int j=s[i].n;j<=Num;j++){
                dp[j]=min(dp[j],dp[j-s[i].n]+s[i].v);
                //printf("%d\n",dp[j]);
            }
        }
        printf("%d\n",min(ans,dp[Num]));
    }
    return 0;
}
